<?php
namespace Admin\Controller;

class WechatController extends AdminController {
    /**
     * 微信相关操作控制器初始化方法.
     * 首先设置了微信平台的初始化参数，第一次使用Wechat实例时它会被自动使用。
     * 这个初始化方法里同时包含了access_token获取更新机制
     *
     */
    public function _initialize()
    {
        parent::_initialize();

        // 初始化微信工具类并刷新access_token
        refresh_access_token($this);
    }




    /**
     * 微信公众平台上配置的回调接口.
     * 对微信服务器发来的消息进行路由，
     * 以钩子的方式增加对消息的处理.
     * 注意：此接口是通过.htaccess文件重定向的(以 http://域名/wechat/来访问)
     *
     */
    public function api(){
        trace('wechat api start','wechat');

        // 微信平台接入验证
        C('WECHAT_VALID') && $this['Wechat']->valid();

        // 接收消息
        $this['Wechat']->getRev();
        trace($this['Wechat']->getRevData(),'wechat');

        // 获取消息发送者
        $fromUserName = $this['Wechat']->getRevFrom();

        // 获取消息接受者
        $toUserName = $this['Wechat']->getRevTo();

        trace("form {$fromUserName} to {$toUserName}", 'wechat');

        // 获取消息类型
        $type = $this['Wechat']->getRev()->getRevType();
        trace('消息类型： '.$type .'\n消息内容：'.$this['Wechat']->getRevContent() ,'wechat');

        // 获取消息正文
        $content = $this['Wechat']->getRev()->getRevContent();
        trace($content,'wechat:contnet');
        trace($this['Wechat']->getRevEvent(),'wechat:event');

        // 根据类型映射到相关操作
        switch( $type ) {
            case $this['Wechat']::MSGTYPE_TEXT:
                break;
            case $this['Wechat']::MSGTYPE_IMAGE:
                break;
            case $this['Wechat']::MSGTYPE_LOCATION:
                break;
            case $this['Wechat']::MSGTYPE_LINK:
                break;
            case $this['Wechat']::MSGTYPE_EVENT:
                break;
            case $this['Wechat']::MSGTYPE_MUSIC:
                break;
            case $this['Wechat']::MSGTYPE_NEWS:
                break;
            case $this['Wechat']::MSGTYPE_VOICE:
                break;
            case $this['Wechat']::MSGTYPE_VIDEO:
                break;
            case $this['Wechat']::MSGTYPE_SHORTVIDEO:
                break;
            default:
                trace('消息类型未匹配','wechat');
                $this['Wechat']->text("未匹配类型")->reply();
        }

        // 调试用返回
//        $this['Wechat']->text('消息类型： '.$type .'\n消息内容：'.$this['Wechat']->getRevContent())->reply();



    }



    /**
     * 微信自定义菜单.
     * 注意：尽量不要修改此方法，因为几个月前做出来之后我现在看也看的蒙了，
     * 改了之后可能会有问题，能用就行
     * 注意：我在 系统->微信配置->微信按钮类型列表 中添加了微信按钮的类型与事件映射表，
     * 触发微信更新，否则不需改动
     *
     */
    public function menu(){
        if ( IS_POST ) {
            //重排菜单数组
            $i = 0;
            foreach($_POST['menu']['button'] as $k=>$v){
                if(is_array($v['sub_button'])){
                    $menu['button'][$i]['name'] = $v['name'];
                    $menu['button'][$i]['sub_button'] = array_merge($v['sub_button']);
                }else{
                    $menu['button'][$i] = $v;
                }
                $i++;
            }

            if($this['Wechat']->createMenu($menu)){
                // 是否保存菜单设置数据
                if ( C('CACHE_WECHAT_MENU') ) {
                    M('Wechat')->where("`original_id` = '".C('WECHAT_ORIGINALID') . "'")->setField('menu', json_encode($menu));
                }
                $this->alert['status'] = 1;
                $this->alert['msg'] = '更新成功';
            }else{
                $this->alert['status'] = 0;
                $this->alert['msg'] = '更新失败 '.$this['Wechat']->errCode.' '.$this['Wechat']->errMsg;
            }
            $menu['menu'] = $menu;
        } else {

            // 是否开启缓存，开启则显示缓存的菜单，未开启则从微信获取
            if ( C('CACHE_WECHAT_MENU') ) {
                $res = M('Wechat')->where("`original_id` = '".C('WECHAT_ORIGINALID') . "'")->getField('menu');
                $menu = json_decode($res,true);
                $menu['menu'] = $menu;

                if ( !$menu ) {
                    trace('缓存中无微信菜单，关闭缓存试试','wechat');
                    $this->alert['status'] = 0;
                    $this->alert['msg'] = '获取缓存微信菜单失败，请及时排查原因 ';
                } else {
                    $this->alert['status'] = 1;
                    $this->alert['msg'] = '获取微信菜单缓存成功';
                }
            } else {
                // 获取在线菜单
                $menu = $this['Wechat']->getMenu();
                if ( !$menu ) {
                    trace('线上无微信菜单','wechat');
                    $this->alert['status'] = 0;
                    $this->alert['msg'] = '获取微信菜单失败，显示本地菜单缓存，请及时排查原因 '.$this['Wechat']->errCode.' '.$this['Wechat']->errMsg;

                    // 获取缓存的菜单
                    $res = M('Wechat')->where("`original_id` = '".C('WECHAT_ORIGINALID') . "'")->getField('menu');
                    $menu = json_decode($res,true);
                    $menu['menu'] = $menu;
                } else {
                    $this->alert['status'] = 1;
                    $this->alert['msg'] = '获取线上微信菜单成功';
                }
            }
        }
        $this->assign('menu',$menu['menu']['button']);

        //dump(C('WECHAT_BUTTON_TYPE_LIST'));
        $type_list = C('WECHAT_BUTTON_TYPE_LIST');
        $this->assign('type_list',$type_list);



        // 前台操作提示
        $this->alert();
        $this->display('menu');

    }



    public function foreverMedia(){
        // 获取永久素材
        $res = $this['Wechat']->getForeverList('news',0,20);
        dump($res);
        $this->assign('list',$res['item']);

        $this->display();
    }


}